HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Admin/DriverController.php
<?php

namespace App\Http\Controllers\Admin;

use App\DataTables\Admin\DriverDataTable;
use App\Http\Controllers\Controller;
use App\Models\Document;
use App\Models\Driver;
use App\Models\Transporter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class DriverController extends Controller
{
    public function index(DriverDataTable $dataTable)
    {
        return $dataTable->render('admin.driver.index');
    }
    public function create()
    {
        $transporters = Transporter::all();
        return view('admin.driver.create', compact('transporters'));
    }


    public function store(Request $request)
    {
        $request->validate([
            'transporter_id' => 'required|exists:transporters,id',
            'name'          => 'required|string|max:255',
            'email'         => 'required|email|max:255|unique:drivers,email',
            'phone'         => 'required|string|max:10|unique:drivers,phone',
            'age'           => 'required|string',
            'gender'        => 'required|in:male,female,other',
            'profile_image' => 'required|file|mimes:jpg,jpeg,png|max:2048',
            'documents'             => 'required|array|min:1',
            'documents.*.type'      => 'required|string|in:dl,aadhar,pan,passport',
            'documents.*.number'    => 'required|string|max:255',
            'documents.*.file'      => 'required|file|mimes:jpg,jpeg,png,pdf|max:2048',
            // 'documents.*.expiry_date' => 'required_if:documents.*.type,dl|date|after:today',
        ], [
            'documents.required'      => 'At least one document is required.',
            'documents.*.type.required'   => 'Document type is required.',
            'documents.*.type.in'         => 'Invalid document type selected.',
            'documents.*.number.required' => 'Document number is required.',
            'documents.*.file.required'   => 'Document photo/file is required.',
            'documents.*.expiry_date.required_if' => 'Expiry date is required for Driving License.',
            'documents.*.expiry_date.after' => 'Expiry date must be a future date.',
        ]);

        $driver = new Driver();
        $driver->transporter_id = $request->transporter_id;
        $driver->name = $request->name;
        $driver->email = $request->email;
        $driver->phone = $request->phone;
        $driver->about = $request->about;
        $driver->experience = $request->experience;
        $driver->alternate_number = $request->alternate_number;
        $driver->age    = $request->age;
        $driver->gender = $request->gender;
        $driver->status = $request->status;

        if ($request->hasFile('profile_image')) {
            $driver->image = $request->file('profile_image')->store("uploads/driver/temp", 'public');
        }

        $driver->save();

        if ($driver->image) {
            $path = str_replace("temp", $driver->id, $driver->image);
            Storage::disk('public')->move($driver->image, $path);
            $driver->image = $path;
            $driver->save();
        }

        foreach ($request->documents as $doc) {
            $filePath = null;
            if (!empty($doc['file'])) {
                $filePath = $doc['file']->store("uploads/driver/{$driver->id}", 'public');
            }

            $driver->documents()->create([
                'doc_type'   => $doc['type'],
                'doc_number' => $doc['number'],
                'file_url'   => $filePath,
                'expiry_date' => $doc['expiry_date'] ?? null,
            ]);
        }
        $driver->refreshVerificationStatus();

        return redirect()->route('admin.driver.index')->with('success', 'Driver created successfully!');
    }


    public function edit(string $id)
    {
        $driver = Driver::find($id);
        if (!isset($driver)) {
            return redirect()->route('admin.driver.index')->with('error', 'Driver not found!');
        }
        $transporters = Transporter::all();
        return view('admin.driver.edit', compact('driver', 'transporters'));
    }

    public function view(string $id)
    {
        $driver = Driver::with('documents')->find($id);
        if (!isset($driver)) {
            return redirect()->route('admin.driver.index')->with('error', 'Driver not found!');
        }
        // dd($driver);
        return view('admin.driver.view', compact('driver'));
    }
    public function update(Request $request, string $id)
    {
        $driver = Driver::find($id);
        if (!$driver) {
            return redirect()->route('admin.driver.index')->with('error', 'Driver not found!');
        }

        $hasDocuments = $driver->documents()->exists();

        $rules = [
            'transporter_id' => 'required|exists:transporters,id',
            'name'           => 'required|string|max:255',
            'email'          => 'required|email|max:255|unique:drivers,email,' . $driver->id,
            'phone'          => 'required|string|max:15|unique:drivers,phone,' . $driver->id,
            'age'           => 'required|string',
            'gender'        => 'required|in:male,female,other',
            'status'         => 'required|in:active,inactive,suspended',
            'profile_image'  => 'nullable|file|mimes:jpg,jpeg,png|max:2048',
        ];

        if (!$hasDocuments) {
            $rules['documents'] = 'nullable|array';
        } else {
            $rules['documents'] = 'nullable|array';
        }

        $rules['documents.*.type']   = 'required|string|in:dl,aadhar,pan,passport';
        $rules['documents.*.number'] = 'required|string|max:255';
        $rules['documents.*.file']   = 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048';

        $request->validate($rules, [
            'documents.required'             => 'At least one document is required.',
            'documents.*.type.required'      => 'Document type is required.',
            'documents.*.type.in'            => 'Invalid document type selected.',
            'documents.*.number.required'    => 'Document number is required.',
            'documents.*.file.required'      => 'Document photo/file is required.',
            'documents.*.expiry_date.required_if' => 'Expiry date is required for Driving License.',
            'documents.*.expiry_date.after'  => 'Expiry date must be a future date.',
        ]);

        $driver->transporter_id   = $request->transporter_id;
        $driver->name             = $request->name;
        $driver->email            = $request->email;
        $driver->phone            = $request->phone;
        $driver->about            = $request->about;
        $driver->experience       = $request->experience;
        $driver->alternate_number = $request->alternate_number;
        $driver->age    = $request->age;
        $driver->gender = $request->gender;
        $driver->status           = $request->status;

        if ($request->hasFile('profile_image')) {
            if ($driver->image && Storage::disk('public')->exists($driver->image)) {
                Storage::disk('public')->delete($driver->image);
            }
            $driver->image = $request->file('profile_image')
                ->store("uploads/driver/{$driver->id}", 'public');
        }

        $driver->save();

        if ($request->filled('documents')) {
            foreach ($request->documents as $doc) {
                $existingDoc = $driver->documents()->where('doc_type', $doc['type'])->first();
                $filePath = $existingDoc->file_url ?? null;

                if (!empty($doc['file'])) {
                    if ($filePath && Storage::disk('public')->exists($filePath)) {
                        Storage::disk('public')->delete($filePath);
                    }
                    $filePath = $doc['file']->store("uploads/driver/{$driver->id}", 'public');
                }

                $driver->documents()->updateOrCreate(
                    ['doc_type' => $doc['type']],
                    [
                        'doc_number' => $doc['number'],
                        'file_url'   => $filePath,
                        'expiry_date' => $doc['expiry_date'] ?? ($existingDoc->expiry_date ?? null),
                    ]
                );
            }
        }
        $driver->refreshVerificationStatus();

        return redirect()->route('admin.driver.index')->with('success', 'Driver updated successfully!');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        $driver = Driver::find($id);
        if (!isset($driver)) {
            return response()->json([
                'status' => false,
                'message' => 'Driver not found!',
            ]);
        }
        foreach ($driver->documents as $document) {
            if ($document->file_url && Storage::disk('public')->exists($document->file_url)) {
                Storage::disk('public')->delete($document->file_url);
            }
            $document->delete();
        }
        $driver->delete();

        return response()->json([
            'status' => true,
            'message' => 'Driver deleted successfully!',
        ]);
    }
    public function deleteDocument(string $id)
    {
        $doc = Document::findOrFail($id);
        if ($doc->file_url && Storage::disk('public')->exists($doc->file_url)) {
            Storage::disk('public')->delete($doc->file_url);
        }

        $doc->delete();

        return response()->json(['success' => true, 'message' => 'Document deleted successfully.']);
    }
    public function verifyDocument($id)
    {
        $document = Document::findOrFail($id);
        $document->is_verified = 1;
        $document->save();

        return response()->json(['message' => 'Document verified successfully!']);
    }
    public function verifyDriver(Request $request, $id)
    {
        $driver = Driver::with('documents')->findOrFail($id);

        if ($request->status == 1) {
            $allVerified = $driver->documents->count() > 0 &&
                $driver->documents->where('is_verified', 0)->count() == 0;

            if (! $allVerified) {
                return response()->json(['message' => 'All documents must be verified before marking driver verified.'], 422);
            }
        }

        $driver->is_verified = $request->status == 1;
        $driver->save();

        return response()->json(['message' => 'Driver verification status updated successfully!']);
    }
    public function updateStatus(Request $request, $id)
    {
        try {
            $driver = Driver::findOrFail($id);
            $driver->status = $request->status;
            $driver->save();

            return response()->json([
                'success' => true,
                'message' => 'Driver status updated successfully!',
                'status'  => $driver->status
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Something went wrong: ' . $e->getMessage()
            ], 500);
        }
    }
}